package cn.cxyxj.inner_client.utils;

import cn.hutool.jwt.JWT;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.UUID;

public class JWTUtil {
    // 应用密钥
    public static final String APPSECRET_KEY = "cxyxj_awesome";

    public static String createToken(String account) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("account", account);

        String tokenStr = Jwts.builder().setClaims(map)
                // 设置jti(JWT ID)：是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。
                .setId(UUID.randomUUID().toString())
                // iat: jwt的签发时间
                .setIssuedAt(new Date())
                // 代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串
                .setSubject(account)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(SignatureAlgorithm.HS256, APPSECRET_KEY)
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 1000))
                .compact();
        return tokenStr;
    }

    /**
     * Token的解密
     *
     * @param token 加密后的token
     * @return
     */
    public static JWT parseJWT(String token) {
        // 先验证 token 是否由本系统签发
        return cn.hutool.jwt.JWTUtil.parseToken(token);
    }
    /**
     * 校验Token是否过期
     */
    public static boolean isExpiration(String token) {
        Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody();
        return claims.getExpiration().before(new Date());
    }

    public static void main(String[] args) {
        // 生成jwt
        String jwt = JWTUtil.createToken(""); // 10秒过期
        System.out.println(jwt); // 生成token
        // 解析jwt
        JWT claims = parseJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsicmVzb3VyY2Vfc2VydmVyX2lkIl0sInVzZXJfbmFtZSI6ImRldiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2Nzc1NjA0OTgsImF1dGhvcml0aWVzIjpbIlJPTEVfYWRtaW4iXSwianRpIjoiMzc1NDIyYTYtMjkwMi00YzFhLThhYTgtYjJkN2UxZGYxNmMyIiwiY2xpZW50X2lkIjoiY2xpZW50LWEifQ.vIhaBmIUwyyckxdPlOOWil2IgXL6tothzjyT4Sw46T8");
        // 获取用户名信息
        //Object username = claims.get("account");
        //System.out.println("用户名:" + username); // 解析token
    }
}

